/*
 * CambioClaveBean
 *
 * Creado el 15/07/2009, 06:46:46 PM
 */
package com.unicon.autoservicio.view.bean;

import com.unicon.autoservicio.bean.ObraBeanViewBean;
import com.unicon.autoservicio.bean.UsuarioViewBean;
import com.unicon.autoservicio.dao.SeguridadDAO;
import com.unicon.autoservicio.util.FacesUtils;
import com.unicon.sdc.ds.ws.ActualizarCambioClave;
import com.unicon.sdc.ds.ws.ObraBean;
import com.unicon.sdc.ds.ws.ResultType;
import com.unicon.view.ManageBeanNames;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import nl.captcha.Captcha;

/**
 *
 * @author Ricardo Rodríguez
 */
public  class CambioClaveBean extends BaseManageBean {

    private static long serialVersionUID = 1;
    private String usuario;
    private String clave;
    private String claveNueva;
    private String claveNuevaRepetida;
    private String selectedUsuario;
    private SelectItem[] lstClienteItems;
    private BufferedImage captchaImage;
    private String pregunta;
    private String respuesta;
    private String guess;
    private String answer;
    private String result;
    private Captcha captcha;
    private List<UsuarioViewBean> listaUsuario;
    private String descripcionCliente;

    /**
     * Creates a new instance of CambioClaveBean
     */
    public CambioClaveBean() {
        usuario = "";
        clave = "";
        claveNueva = "";
        claveNuevaRepetida = "";
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
        guess = "";
        listaUsuario = new ArrayList<UsuarioViewBean>();
        lstClienteItems = null;


        getUsuarioCliente();


    }

    /* JMENDOZA | 20140303 | Proy. 817: Se crea metodo que verifica si se ha retornado datos del usuario y cliente en el request */
    /* 20140303-01 | INICIO */
    public void getUsuarioCliente() {

        UsuarioBean usu = getSessionUser();

        if (usu != null  && usu.getCodigoUsuario().length()>0 ) {
            usuario = usu.getUsuario();
            selectedUsuario = usu.getCodigoUsuario();
            descripcionCliente = usu.getDescripcionCliente();

            System.out.println("selectedUsuario 1--" + selectedUsuario);
            System.out.println("descripcionCliente--" + descripcionCliente);


             buscarClientes();
            System.out.println("selectedUsuario 2--" + selectedUsuario);
        } else {



            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

            System.out.println("1");
            if (request != null) {
  
                System.out.println("req-"+request.getContentLength());
                String usuario_ = "";
                String selectedUsuario_ = "";

                if ((request.getAttribute("login") != null) && (request.getAttribute("usuario") != null)) {
                    usuario_ = request.getAttribute("login").toString();
                    selectedUsuario_ = request.getAttribute("usuario").toString();
                    System.out.println("usuario_" + usuario_);
                    System.out.println("selectedUsuario_" + selectedUsuario_);
//                if ((!usuario_.isEmpty()) ||(!selectedUsuario_.isEmpty())) {
                    request.removeAttribute("login");
                    request.removeAttribute("usuario");
                    usuario = usuario_;
                    selectedUsuario = selectedUsuario_;
                    btnBuscarClientesPerformed();
//                }

                }
            }
        }

    }
    /* 20140303-01 | FIN */

    /* JMENDOZA | 20140303 | Proy. 817: Se crea metodo que guarda en el request el usuario y el cliente */
    /* 20140303-03 | INICIO */
    public void setUsuarioCliente() {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if (request != null) {
            request.setAttribute("login", this.usuario);
            request.setAttribute("usuario", this.selectedUsuario);
            request.setAttribute("flag", "1");
        }
    }
    /* 20140303-03 | FIN */

    // <editor-fold defaultstate="collapsed" desc="Getter & Setter">
    /**
     * @return the usuario
     */
    public String getUsuario() {
        /* JMENDOZA | 20140303 | Proy. 817: Se agrega llamado a la funcion que verifica el request */
        /* 20140303-02 | INICIO */
        getUsuarioCliente();
        /* 20140303-02 | FIN */
        return usuario;

    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the clave
     */
    public String getClave() {
        return clave;
    }

    /**
     * @param clave the clave to set
     */
    public void setClave(String clave) {
        this.clave = clave;
    }

    /**
     * @return the claveNueva
     */
    public String getClaveNueva() {
        return claveNueva;
    }

    /**
     * @param claveNueva the claveNueva to set
     */
    public void setClaveNueva(String claveNueva) {
        this.claveNueva = claveNueva;
    }

    /**
     * @return the claveNuevaRepetida
     */
    public String getClaveNuevaRepetida() {
        return claveNuevaRepetida;
    }

    /**
     * @param claveNuevaRepetida the claveNuevaRepetida to set
     */
    public void setClaveNuevaRepetida(String claveNuevaRepetida) {
        this.claveNuevaRepetida = claveNuevaRepetida;
    }
    // </editor-fold>

    public String btnCambioClave() {

        if (getGuess().equals(getAnswer())) {
            if (claveNueva.equals(claveNuevaRepetida)) {
                SeguridadDAO seguridadDao = new SeguridadDAO();


                ResultType result = seguridadDao.actualizarCambioClave(getSelectedUsuario(), clave, claveNueva, pregunta, respuesta);



                if (result.getResult().equals(Boolean.TRUE)) {
                    /* JMENDOZA | 20140303 | Proy. 817: Se corrige el mensaje de cambio de clave y se llama al método        */
                    /*                                  setUsuarioCliente() que guarda el usuario y el cliente en el request */
                    /* 20140303-04 | INICIO */
                    //FacesUtils.addErrorMessage("Su Clave a sido actualizada correctamente.");
                    FacesUtils.addErrorMessage("Su Clave ha sido actualizada correctamente.");


                    UsuarioBean usu = new UsuarioBean();

                    com.unicon.sdc.ds.ws.UsuarioBean usuarioAutoservicio = seguridadDao.getUsuarioBean(getSelectedUsuario(), claveNueva);

                    usu.setUsuario(getUsuario());
                    usu.setCodigoCliente(usuarioAutoservicio.getCodigoCliente());
                    usu.setCodigoUsuario(getSelectedUsuario());
                    usu.setCodigoPerfil(usuarioAutoservicio.getCodigoPerfil());
                    usu.setDescripcionCliente(usuarioAutoservicio.getDescripcionCliente());
                    usu.setDescripcionObra(usuarioAutoservicio.getDescripcionObra());
                    usu.setNombre(usuarioAutoservicio.getNombre());
                    usu.setPerfil(usuarioAutoservicio.getPerfil());
                    ArrayList<VistaBean> vistas = new ArrayList<VistaBean>();
                    VistaBean vista = null;
                    for (com.unicon.sdc.ds.ws.VistaBean v : usuarioAutoservicio.getVistas()) {
                        vista = new VistaBean(v);
                        vistas.add(vista);
                    }
                    usu.setVistas(vistas);


                    List<ObraBean> obrasWs = seguridadDao.getObrasPorCliente(usuarioAutoservicio.getCodigoCliente(), getSelectedUsuario(), usuario, clave);

                    ArrayList<ObraBeanViewBean> obras = new ArrayList();

                    if (obrasWs != null && obrasWs.size() > 0) {
                        ObraBeanViewBean obra = null;
                        for (ObraBean ob : obrasWs) {
                            obra = new ObraBeanViewBean(ob);
                            obras.add(obra);
                        }
                    }

                    usu.setObras(obras);


                    FacesUtils.setManagedBeanInSession(ManageBeanNames.BEAN_USUARIO, usu);
                    setUsuarioCliente();
                    /* 20140303-04 | FIN */



                } else {
                    FacesUtils.addErrorMessage(result.getMessage());
                    return null;
                }

            } else {
                FacesUtils.addErrorMessage("Las claves nuevas no son iguales.");
                return null;
            }


        } else {
            inicializarCampos();
            FacesUtils.addErrorMessageFromResource("error.codigoCaptchaIncorrecto", null);
            captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
            captchaImage = captcha.getImage();
            return null;
        }
      

        return "ingresar";
    }

    public void refreshCaptcha(ActionEvent event) {
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();

        captchaImage = captcha.getImage();

        setAnswer(captcha.getAnswer());
    }

    public void buscarClientes() {
        SeguridadDAO seguridadDao = new SeguridadDAO();
        List<com.unicon.sdc.ds.ws.UsuarioBean> lista = seguridadDao.getEmpresasUsuario(usuario);

        if (lista != null && lista.size() > 0) {
            setLstClienteItems(new SelectItem[lista.size()]);

            int i = 0;
            for (com.unicon.sdc.ds.ws.UsuarioBean usuario : lista) {
                UsuarioViewBean usu = new UsuarioViewBean(usuario);
              
               
                if (getSelectedUsuario().equals(usuario.getCodigoUsuario())) {
                    setSelectedUsuario(usuario.getCodigoUsuario());
                    setPregunta(usu.getPregunta());
                }
                i++;
            }
        }



    }

    public boolean btnBuscarClientesPerformed() {

        if (logger.isDebugEnabled()) {
            StringBuffer sb = new StringBuffer("El login ");
            sb.append(usuario).append(" buscando Cliente.");
            logger.debug(sb.toString());
        }

        SeguridadDAO seguridadDao = new SeguridadDAO();
        List<com.unicon.sdc.ds.ws.UsuarioBean> lista = seguridadDao.getEmpresasUsuario(usuario);

        if (lista != null && lista.size() > 0) {
            setLstClienteItems(new SelectItem[lista.size()]);

            int i = 0;
            for (com.unicon.sdc.ds.ws.UsuarioBean usuario : lista) {
                UsuarioViewBean usu = new UsuarioViewBean(usuario);
                getListaUsuario().add(usu);
                getLstClienteItems()[i] = new SelectItem(usuario.getCodigoUsuario(), usuario.getDescripcionCliente());
                System.out.println("getSelectedUsuario()----" + getSelectedUsuario());
                System.out.println("getCodigoUsuario()----" + getSelectedUsuario());
                if (getSelectedUsuario().equals(usuario.getCodigoUsuario())) {
                    setSelectedUsuario(usuario.getCodigoUsuario());
                    setPregunta(usu.getPregunta());
                }
                i++;
            }
        } else {

            FacesUtils.addErrorMessageFromResource("error.clientesPorUsuario", null);
            try {
                setLstClienteItems(null);
                throw new Exception("No existen usuarios registrados  para  la cuenta que se desea loguear : " + getUsuario());
            } catch (Exception ex) {
                logger.error(ex.getMessage(), ex);
                return true;
            }

        }

        return true;
    }

    /* JMENDOZA | 20140303 | proy. 817: Se crea metodo que a su vez llama al metodo setUsuarioCliente() y retorna a la pagina de inicio de sesión */
    /* 20140303-05 | INICIO */
    public String btnRegresarActionPerformed() {
        setUsuarioCliente();
        return "regresar";
    }
    /* 20140303-05 | INICIO */

    public String btnNuevoActionPerformed() {
        return "regresar";
    }

    //<editor-fold defaultstate="collapsed" desc="Getter and Setter">
    /**
     * @return the selectedUsuario
     */
    public String getSelectedUsuario() {
        return selectedUsuario;
    }

    /**
     * @param selectedUsuario the selectedUsuario to set
     */
    public void setSelectedUsuario(String selectedUsuario) {
        this.selectedUsuario = selectedUsuario;
    }

    /**
     * @return the lstClienteItems
     */
    public SelectItem[] getLstClienteItems() {
        return lstClienteItems;
    }

    /**
     * @param lstClienteItems the lstClienteItems to set
     */
    public void setLstClienteItems(SelectItem[] lstClienteItems) {
        this.lstClienteItems = lstClienteItems;
    }

    public byte[] getCaptchaImage() {
        if (captchaImage == null) {
            refreshCaptcha(null);
        }
        return covertImageToBytes(captchaImage);
    }

    private static byte[] covertImageToBytes(BufferedImage image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", baos);
        } catch (IOException ex) {
        }
        return baos.toByteArray();
    }

    /**
     * @param captchaImage the captchaImage to set
     */
    public void setCaptchaImage(BufferedImage captchaImage) {
        this.captchaImage = captchaImage;
    }

    /**
     * @return the guess
     */
    public String getGuess() {

        return guess;
    }

    /**
     * @param guess the guess to set
     */
    public void setGuess(String guess) {
        this.guess = guess;
    }

    /**
     * @return the answer
     */
    public String getAnswer() {
        answer = captcha.getAnswer();
        return answer;
    }

    /**
     * @param answer the answer to set
     */
    public void setAnswer(String answer) {
        this.answer = answer;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }

    /**
     * @param result the result to set
     */
    public void setResult(String result) {
        this.result = result;
    }

    /**
     * @return the captcha
     */
    public Captcha getCaptcha() {
        return captcha;
    }

    /**
     * @param captcha the captcha to set
     */
    public void setCaptcha(Captcha captcha) {
        this.captcha = captcha;
    }
    //</editor-fold>

    private void inicializarCampos() {

        usuario = "";
        clave = "";
        claveNueva = "";
        claveNuevaRepetida = "";

        lstClienteItems[0] = new SelectItem("", "Empresas Asociadas");
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
        captchaImage = captcha.getImage();
        setAnswer(captcha.getAnswer());
        guess = "";
    }

    public boolean onChangeTest(ValueChangeEvent event) {

        if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
            return true;
        }



        for (com.unicon.sdc.ds.ws.UsuarioBean cliente : getListaUsuario()) {

            if (selectedUsuario.equals(cliente.getCodigoUsuario())) {

                setPregunta(cliente.getPregunta());
            }
        }

        return true;

    }

    public String getPregunta() {




        return pregunta;
    }

    /**
     * @param pregunta the pregunta to set
     */
    public void setPregunta(String pregunta) {


        this.pregunta = pregunta;
    }

    /**
     * @return the respuesta
     */
    public String getRespuesta() {
        return respuesta;
    }

    /**
     * @param respuesta the respuesta to set
     */
    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }

    /**
     * @return the listaUsuario
     */
    public List<UsuarioViewBean> getListaUsuario() {
        return listaUsuario;
    }

    /**
     * @param listaUsuario the listaUsuario to set
     */
    public void setListaUsuario(List<UsuarioViewBean> listaUsuario) {
        this.listaUsuario = listaUsuario;
    }

    public boolean buscarClienteListener(ValueChangeEvent event) {

        if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
            return true;
        }


        return btnBuscarClientesPerformed();


    }

    /**
     * @return the descripcionCliente
     */
    public String getDescripcionCliente() {
        return descripcionCliente;
    }

    /**
     * @param descripcionCliente the descripcionCliente to set
     */
    public void setDescripcionCliente(String descripcionCliente) {
        this.descripcionCliente = descripcionCliente;
    }
}
